/**
 * 
 */
package com.metier.logique;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;

/**
 * @author Ambroise
 * @name MSG
 * @description Conteneur spécifique permettant la gestion de ressources définies.<br />
 * 				Fonctionne tel un tableau multidimensensionnel associatif via la variable privé data (HashMap)<br />
 * 				Contient des valeurs dans data sous forme de clé-valeur.<br />
 * 				On peut accéder à ses valeurs via les attributs set/get de l'objet MSG.<br />
 * 				Ex: oMSG.getData("personnage125");<br />
 * @méthodes <br />
 * 				+ MSG - Constructeur par défaut.<br />
 * 				+ MSG(HashMap) - Constructeur surchargé.<br />
 * 				+ MSG(String, Object) - Constructeur surchargé.<br />
 * 				+ getData - Retourne la valeur de la clé du HashMap data.<br />
 * 				+ getDatas - Get<br />
 * 				+ setData - Met à  jour / Ajoute la value dans la key.<br />
 * 				+ setDatas - Set<br />
 * 				+ afficherDatas - Affiche le contenu de la variable privée datas par la sortie standard.<br />
 * 				+ toString - Retourne les valeurs contenues dans data.<br />
 * @since 27/02/2012
 */
public class MSG{
	/**
	 * @description Contient des valeurs sous forme de clé-valeur.<br />
	 * 				On peut accéder à ses valeurs via les attributs set/get de l'objet MSG.<br />
	 * 				Ex: oMSG.getData("personnage125");<br />
	 */
	private HashMap<Object, Object> data;
	
	/**
	 * Constructeur basique:
	 * @desc: Initialise la HashMap (Equivalent à  un tableau associatif).
	 */
	public MSG() {
		this.data =  new HashMap<Object, Object>();
	}
	
	/**
	 * Constructeur surchargé:
	 * @desc: Initialise la HashMap avec une HashMap existante. (Equivalent à  un tableau associatif).
	 */
	public MSG(HashMap<Object, Object> data) {
		this.data = data;
	}
	
	/**
	 * Constructeur surchargé:
	 * @description Permet d'attribuer à l'objet la valeur passée en paramètre.
	 */
	public MSG(String cle, Object valeur){
		this.data =  new HashMap<Object, Object>();
		this.setData(cle, valeur);
	}
	
	
	/*
	 * ---------------------- Accesseurs: ----------------------
	 */
	
	/**
	 * @name: getData
	 * @desc: Retourne la valeur de la clé du HashMap data.
	 * @param: Object - key - Clé du HashTable à  retourner.
	 */
	public Object getData(Object key) {
		return this.data.get(key);
	}
	
	/**
	 * @name: getDatas
	 * @desc: Retourne le HashMap data.
	 */
	public Object getDatas() {
		return this.data;
	}
	
	
	/*
	 * ---------------------- Mutateurs: ----------------------
	 */
	
	/**
	 * @name: setData
	 * @desc: Met à  jour / Ajoute la value dans la key.
	 * @param: 	Object - key - Clé du HashMap.
	 * 			Object - value - Valeur à  mettre dans la clé.
	 */
	public void setData(Object key, Object value) {
		this.data.put(key, value);
	}
	
	/**
	 * @name: setDatas
	 * @desc: Remplace le HashTable data courant par le HashMap datas fourni.
	 * @param: 	Hashtable - datas - HashMap à  mettre dans la variable data de l'objet courant.
	 */
	public void setDatas(HashMap<Object, Object> datas) {
		this.data = datas;
	}
	
	/*
	 * ---------------------- Méthodes: ----------------------
	 */
	
	/**
	 * @name: afficherDatas
	 * @desc: Affiche le contenu de la variable privée datas par la sortie standard.
	 */
	public String afficherDatas() {
		// Set est l'interface d'une liste sans doublon
		// Cette liste contient l'ensemble des pairs clef-valeur
		Set<Entry<Object, Object>> entrySet = this.data.entrySet();

		System.out.println("--------------------- --------------------------");
		System.out.println("----------- Contenu de l'objet MSG -------------");
		System.out.println("--------------------- --------------------------");

		// On crée un itérateur sur la "Set"
		Iterator<Entry<Object, Object>> it = entrySet.iterator();

		String retour = "";
		while (it.hasNext()) {
			Entry<Object, Object> entry = it.next();
			System.out.println(entry.getKey() + "("+entry.getValue().getClass().getSimpleName()+")" + " = " + entry.getValue()+ "("+entry.getValue().getClass().getSimpleName()+")\n");
			retour+= entry.getKey() + "("+entry.getValue().getClass().getSimpleName()+")" + " = " + entry.getValue()+ "("+entry.getValue().getClass().getSimpleName()+")\n";
		}
		
		return retour;
		
	}


	/**
	 * @name toString
	 * @description Retourne les valeurs contenues dans data.
	 * @return String - Valeurs contenues dans data.
	 */
	@Override
	public String toString() {
		return "MSG [data=" + data + "]";
	}


}
